
/**
 * @file         bsc_uart_device.h
 * @brief        串口设备
 * @note    
 * @author       Akee(ysk@hopechart.com)
 *
 * @par          修改日志
 * <table>
 * <tr><th>Date        <th>Version               <th>Author          <th>Description
 * <tr><td>2020-11-03  <td>1.0                   <td>Akee            <td>创建初始版本
 * <tr><td>2022-07-18  <td>2.0                   <td>Jpz             <td>修改波特率获取方式
 * @copyright    杭州鸿泉物联网技术股份有限公司
 */
#ifndef _BSC_UART_DEVICE_H_
#define _BSC_UART_DEVICE_H_

#include "brd/brd_uart.h"
#include "brd/brd_def.h"
#include "sfc/sfc_mutex.h"


#ifdef __cplusplus
extern "C" {
#endif

enum TBsUartParityTag
{
    kBsUartParityNone                     = 0,                        ///< 无校验
    kBsUartParityEven                     = 1,                        ///< 偶校验
    kBsUartParityOdd                      = 2,                        ///< 奇校验
};
typedef enum TBsUartParityTag TBsUartParity;

/**
 * 
 */
typedef struct TBsUartDeviceTag TBsUartDevice;
struct TBsUartDeviceTag
{
    Brd_THandle handle_;
    TSfCriticalSection lock_;
    // UInt32 baudrate_;
};

/**
 * 构造函数
 * @param self:         对象指针
 * @param channel       通道号
 * @param tx_buf        发送缓存地址
 * @param tx_buf_size   发送缓存大小
 * @param rx_buf        接收缓存地址
 * @param rx_buf_size   接收缓存大小
 * @return True  成功
 *         False 失败
 */
Bool TBsUartDeviceCreate(TBsUartDevice *self, Byte channel, void *tx_buf, Int32 tx_buf_size,
                         void *rx_buf, Int32 rx_buf_size);

/**
 * 析构函数
 * @param self: 对象指针
 * @return 
 */
void TBsUartDeviceDestroy(TBsUartDevice *self);


void TBsUartDeviceSetEvent(TBsUartDevice *self, void *method_object, Brd_TOnUartSent do_sent, Brd_TOnUartRecv do_recv, 
                           Brd_TOnUartParityError do_parity);

// parity : 参见Brd_TUartParity
Bool TBsUartDeviceOpen(TBsUartDevice *self, Int32 baudrate, Int32 parity);

void TBsUartDeviceClose(TBsUartDevice *self);
Bool TBsUartDeviceIsOpen(TBsUartDevice *self);
UInt32 TBsUartDeviceBaudrate(TBsUartDevice *self);
Int32 TBsUartDeviceWrite(TBsUartDevice *self, const Byte *data, Int32 data_size);
Bool TBsUartDeviceWriteAble(TBsUartDevice *self);
Int32 TBsUartDeviceRead(TBsUartDevice *self, Byte *buf, Int32 buf_size);


#ifdef __cplusplus
} // extern "C" {
#endif

#endif

/**
 * @} 
 */
 
 
 
